package com.寻找coder;

/*请设计一个高效算法，再给定的字符串数组中，找到包含"Coder"的字符串(不区分大小写)，并将其作为一个新的数组返回。结果字符串的顺序按照"Coder"出现的次数递减排列，若两个串中"Coder"出现的次数相同，则保持他们在原数组中的位置关系。

给定一个字符串数组A和它的大小n，请返回结果数组。保证原数组大小小于等于300,其中每个串的长度小于等于200。同时保证一定存在包含coder的字符串。
测试样例：
["i am a coder","Coder Coder","Code"],3
返回：["Coder Coder","i am a coder"]
 * */
import java.util.*;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Coder {
	public String[] findCoder(String[] A, int n) {
		HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
		Pattern p = Pattern.compile("[Cc][Oo][Dd][Ee][Rr]");
	
		Matcher c;
		int count = 0;
		int sum = 0;
		int i = 0;//表示map中的key代表数组的下标
		for (String s : A) {
			count = 0;
			c = p.matcher(s);
			while (c.find()) {
				count++;
			}
			if (count > 0)
				sum++;
			hm.put(i, count);
			i++;
		}
		List<Entry<Integer, Integer>> list = new ArrayList<Entry<Integer, Integer>>(hm.entrySet());
		Collections.sort(list, new Comparator<Entry<Integer, Integer>>() {

			@Override
			public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) {
				return o2.getValue() - o1.getValue();

			}

		});
		
		String[] b = new String[sum];
		int bi = 0;
		for (Entry e : list) {
			if ((int) e.getValue() != 0) {
				b[bi++] = A[(int) e.getKey()];
			}

		}
        
		return b;

	}
}
